Hinweise zur Konvertierung der A86-Quellcodes fr andere Assembler ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Diese Datei enth„lt eine kurze Beschreibung der A86-spezifischen Features, die in den zu MDEBUG mitgelieferten Quelltexten benutzt werden. - Quelltexte fr den A86 mssen keinerlei 'Red tapes' enthalten (z.B 'CODE SEGMENT ...', 'ASSUME ...', 'PROC NEAR', 'ENDP', etc.). - Per Voreinstellung behandelt der A86 alle Konstanten ohne Formatangabe als hexadezimal falls sie mit der Ziffer '0' beginnen und als dezimal falls sie NICHT mit der Ziffer '0' beginnen. Bin„re Konstanten werden mit dem Suffix 'xB' gekennzeichnet. Das Suffix 'h' kennzeichnet Konstanten explizit als hexadezimal und das Suffix 'xD' kennzeichnet Konstanten explizit als dezimal. Beispiele: Konstante ³ Format ÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄ 012 ³ hexadezimal 0CC ³ hexadezimal 300 ³ dezimal 300h ³ hexadezimal 011xB ³ bin„r 044xD ³ dezimal - Falls keine 'PROC'-Anweisungen vorhanden sind, sind RET-Befehle immer 'RET NEAR'-Befehle. 'RET FAR'-Befehle mssen als 'RETF' kodiert werden. - PUSH- und POP-Befehle k”nnen mehrere Operanden haben. Beispiel: push ax,bx,cx wird bersetzt als push ax push bx push cx oder pop ds,es wird bersetzt als pop ds pop es - INC- und DEC-Befehle k”nnen einen zweiten Operanden fr die Anzahl der Inkrementierungen bzw. Dekrementierungen haben. Beispiel: inc ax,2 wird bersetzt als inc ax inc ax oder: dec cx,3 wird bersetzt als dec cx dec cx dec cx - Zuweisungen von direkten Werten an Segment-Register sind m”glich. Beispiel: mov ds,040h wird bersetzt als push ax mov ax,040h mov ds,ax pop ax - Zuweisungen der Form 'mov segreg,segreg' sind ebenfalls m”glich. Beispiel: mov ds,cs wird bersetzt als push cs pop ds - Der A86 kennt lokale Bezeichner. Jeder Bezeichner, der mit einem Buchstaben beginnt und dessen restliche Zeichen nur Ziffern sind, ist ein lokaler Bezeichner. Beispiele: L001: L4 EQU CR T005 PROC NEAR M1 MACRO db 0 #EM Lokale Bezeichner k”nnen beliebig neu definiert werden. Der A86 verwendet immer die gerade definierten Werte fr einen lokalen Bezeichner. Beispiel: L0 EQU 040h ; <ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ mov ax,l0 ; verwendet die EQU-Konstante L0 ÄÙ mov bx,offset >l0 ; verwendet den Offset des Labels L0 Ä¿ ; (das Gr”áerzeichen markiert eine ³ ; 'Forward'-Referenz!) ³ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ l0: ; <ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ mov ax,4 ; ³ jmp l0 ; springt zu diesem Label ÄÙ cmp cx,4 je >l0 ; das Gr”áerzeichen vor einem lokalen ; Label markiert eine 'Forward'-Referenz, ; d.h. der Befehl springt zu diesem ; Label ÄÄ¿ ret ; ³ l0: ; <ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ - Forward-Referenzen sind, falls nichts anderes angegeben ist, immer Referenzen auf Konstanten. Beispiel: mov ax,ByteOffset ; Falls 'ByteOffset' hier noch NICHT definiert ; ist, wird dieser Befehl vom A86 behandelt ; als ; 'MOV AX, Offset ByteOffset' - Zur expliziten Angabe des Formats einer Variablen k”nnen die Buchstaben B, W und D angegeben werden. Beispiel: MOV B[45h],12h entspricht: MOV BYTE PTR [45h],12h MOV W[1234],0 entspricht: MOV WORD PTR [1234],0 LDS D[05678] entspricht: LDS DWORD PTR [05678] - Der A86 erlaubt auch folgende Konstruktionen: cmp ax,4 IF e jmp Ende wird bersetzt als: cmp ax,4 jne label1 jmp Ende Label1: oder: cmp ax,4 IF ne mov ax,0 wird bersetzt als: cmp ax,4 jne label1 mov ax,0 label1: - Als Ziel fr einen Sprung kann auch 'RET' angegeben werden. Beispiel: mov ax,4 jmp ret ; springt zum n„chsten RET NEAR-Befehl ; (vorw„rts oder zurck) - Struktur-Definitionen k”nnen ein Basisregister haben. Beispiel: BSP_STRUC[BX] Element1 dw ? Element2 dw ? ENDS mov ax,Element1 ; wird bersetzt als 'mov ax,Element1[bx]' mov Element2,cx ; wird bersetzt als 'mov Element2[bx],cx' fr andere Assembler muá das folgendermaáen kodiert werden: BSP_STRUC Element1 dw ? Element2 dw ? ENDS mov ax,Element1[bx] mov Element2[bx],cx - 'db'-, 'dw'- und 'dd'-Anweisungen k”nnen auch OHNE Operanden angegeben werden. Sie werden dann wie die entsprechenden 'LABEL BYTE'-, 'LABEL WORD'- bzw. 'LABEL DWORD'-Anweisungen behandelt. Beispiel: ThisDWord dd ThisWord dw ThisByte db RealByte db 0 entspricht den Deklarationen: ThisDWord LABEL DWORD ThisWord LABEL WORD ThisByte LABEL BYTE RealByte db 0 - Zur Definition eines Wortes kann auch das Schlsselwort BY verwendet werden. BY dient zur Zusammenfassung von zwei Byte-Werten zu einem Wort-Wert, wobei der erste Operand das Highbyte und der zweite Operand das Lowbyte fr das Wort darstellen. Beispiel: Version EQU 2 BY 1 entspricht der Definition: Version EQU 201h oder: TestVar EQU 'X' BY 0 entspricht der Definition: TestVar EQU 5800h - Der A86 verwendet folgende Macro-Syntax: MACRO name_des_macros ; Macro Text #EM ; Endemarkierung fr das Macro Parameter fr das Macro k”nnen im Macro-Text ber die Konstanten #1, #2 bis #9 angesprochen werden. Die Parameter werden als Text bergeben (nicht als Wert!). - Fr die bedingte Kompilierung werden folgende Schlsselw”rter benutzt: #IF bedingung ; Anweisungen, falls Bedingung TRUE #ELSEIF bedingung ; Anweisungen, falls 2. Bedingung TRUE (weitere #ELSEIFs m”glich) #ELSE ; Anweisungen, falls keine vorherige Bedingung TRUE war #ENDIF M”gliche Bedingungen (u.a.): op1 LT op2 TRUE, falls der 1. Operand kleiner als der zweite Operand ist op1 GT op2 TRUE, falls der 1. Operand kleiner als der zweite Operand ist op1 EQ op2 TRUE, falls der 1. Operand gleich dem zweiten Operanden ist op1 NE op2 TRUE, falls der 1. Operand nicht gleich dem zweiten Operanden ist Bedingungen der Form '!konstanten_name' sind TRUE, falls die Konstante noch NICHT deklariert ist. Beispiel: #IF !ENGLISCH db 'Deutsche Meldung' ; Konstante Englisch ist nicht ; definiert #ELSE db 'English message' ; Konstante Englisch ist ; definiert #ENDIF Falls Anweisungen zur bedingten Kompilierung in Macros bernommen werden sollen (d.h. sie sollen erst beim Aufruf des Macros ausgewertet werden), mssen die Schlsselw”rter fr die bedingte Kompilierung mit zwei Nummernzeichen beginnen.